package Day_0216.JVM.GarbageCollection;

/**
 * @author zxc
 * @date 2023/02/16 17:41
 **/
public class Methodarea_Garbage_Collection {
    public static void main(String[] args) {
        /**
         * 方法区的垃圾回收
         * ===》
         * 1.方法区中的垃圾收集，主要回收两部分内容：
         * （1）运行时常量池中，废弃的常量;
         * （2）不再使用的类型;
         *
         * 2..运行时常量池中废弃的常量
         * （1）方法区内运行时常量池之中，主要存放的两大类常量：字面量和符号引用。
         *  字面量，比较接近Java语言层次的常量概念，如文本字符串、被声明为final的常量值等；
         *  而符号引用，则属于编译原理方面的概念，包括下面三类常量：
         *  1）类和接口的全限定名；
         *  2）字段的名称和描述符；
         *  3）方法的名称和描述符。
         *  ===》
         *  Hotspot虚拟机对运行时常量池的回收策略是很明确的，只要常量池中的常量，没有被任何地方引用，就可以被回收。
         *
         * B. 不再使用的类型
         * 判定一个类型是否属于“不再被使用的类型”，需要同时满足下面三个条件：
         * （1）该类所有的实例都已经被回收，也就是Java堆中不存在该类及其任何派生子类的实例。
         * （2）加载该类的类加载器已经被回收，这个条件除非是经过精心设计的可替换类加载器的场景，
         *  如OSGi、JSP的重加载等，否则通常是很难达成的。
         * （2）该类对应的java.lang.Class对象，没有在任何地方被引用，无法在任何地方通过反射访问该类的方法。
         * ===》
         * Java虚拟机被允许对满足上述三个条件的无用类进行回收，这里说的仅仅是“被允许”，而并不是和对象一样，没有引用了就必然会回收。
         *
         * 3.在大量使用反射、动态代理、 CGLib等字节码框架，动态生成JSP以及OSGi这类频繁自定义类加载器的场景中，
         * 通常都需要Java虚拟机具备类型卸载的能力，以保证不会对方法区造成过大的内存压力。
         */
    }
}
